package com.css.fxfzfxqh.modules.util;

import cn.afterturn.easypoi.excel.annotation.Excel;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Map;

/**
 * @Author: zhangSongRui
 * @CreateTime: 2023/06/13
 * @Description: 通过反射动态设置导出的Excel列名
 */
public class ExcelUtil {
    /**
     * 通过反射动态设置导出的Excel列名
     *
     * @param entityClass                            要修改的实体Class
     * @param annotatedColumnName：实体类中被@Excel注解的字段名
     * @param annotationFieldName：实体类中被@Excel中注解的属性名
     * @param newAnnotationFieldValue：属性的新值
     */
    public static void setExcelAnnotationValue(Class<?> entityClass, String annotatedColumnName, String annotationFieldName, String newAnnotationFieldValue) {
        try {
            Map map = getMap(entityClass, annotatedColumnName);
            //替换
            map.put(annotationFieldName, newAnnotationFieldValue);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据输入的list动态更改EasyPoi中控制列显示的值
     * @param entityClass  要修改的实体Class
     * @param columnNameList 实体类中被@Excel注解的字段名
     * @param flag 是否隐藏
     * @throws Exception
     */
    public static void hideColumn(Class<?> entityClass,List<String> columnNameList,Boolean flag) {
        try {
            if (null==flag){
                flag=true;
            }
        for (String columnName : columnNameList) {
            //获取目标对象的属性值
            Map memberValues = getMap(entityClass, columnName);
            //隐藏
            memberValues.put("isColumnHidden", flag);
        }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //根据class和字段名获取excel的注解反射map
    private static Map getMap(Class<?> entityClass, String columnName) throws NoSuchFieldException, IllegalAccessException {
        Field field = entityClass.getDeclaredField(columnName);
        //获取注解反射对象
        Excel excelAnnon = field.getAnnotation(Excel.class);
        //获取代理
        InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelAnnon);
        Field excelField = invocationHandler.getClass().getDeclaredField("memberValues");
        excelField.setAccessible(true);
        Map memberValues = (Map) excelField.get(invocationHandler);
        return memberValues;
    }
}
